// package com.xuyuan.json.jackson.study;
//
// import cn.hutool.core.util.StrUtil;
// import com.dap.flow.design.codegen.commonjava.metainfo.ParamInfo;
// import com.dap.flow.design.codegen.jcodemodel.ConstantsJcode;
// import com.dap.flow.design.codegen.jcodemodel.method.JDefinedMethodFill;
// import com.dap.flow.design.codegen.web.StructNode;
// import com.helger.jcodemodel.*;
// import org.springframework.util.ObjectUtils;
//
// import java.util.Arrays;
// import java.util.List;
// import java.util.Set;
//
// public class GetterAndSetterFill implements JDefinedMethodFill {
//     @Override
//     public void fill(JCodeModel jCodeModel, JDefinedClass definedClass, List<ParamInfo> listParams) {
//         if (!ObjectUtils.isEmpty(listParams)) {
//             for (ParamInfo paramInfo : listParams) {
//                 // step 1 属性装填。
//                 AbstractJClass ref;
//                 if (List.class.getName().equals(paramInfo.getPropType())) {
//                     ref = jCodeModel.ref(paramInfo.getGenericClass());
//                     List<AbstractJClass> abstractJClasses = Arrays.asList(ref);
//                     JNarrowedClass jNarrowedClass = new JNarrowedClass(jCodeModel.ref(List.class.getName()), abstractJClasses);
//                     ref = jNarrowedClass;
//                 } else if (Set.class.getName().equals(paramInfo.getPropType())) {
//                     ref = jCodeModel.ref(paramInfo.getGenericClass());
//                     List<AbstractJClass> abstractJClasses = Arrays.asList(ref);
//                     JNarrowedClass jNarrowedClass = new JNarrowedClass(jCodeModel.ref(Set.class.getName()), abstractJClasses);
//                     ref = jNarrowedClass;
//                 } else {
//                     ref = jCodeModel.ref(paramInfo.getPropType());
//                 }
//
//                 // step 2 生成 setter 。
//                 JMethod setter = definedClass.method(JMod.PUBLIC, jCodeModel.VOID, setterName(paramInfo));
//                 JVar param = setter.param(ref, paramInfo.getPropCode());
//                 setter.body().add(JExpr.refthis(paramInfo.getPropCode()).assign(param));
//                 // step 3 生成 getter 。
//                 JMethod method = definedClass.method(JMod.PUBLIC, ref, getterName(paramInfo));
//                 AbstractJClass ref1 = jCodeModel.ref(ConstantsJcode.JSON_PROPERTY);
//                 JAnnotationUse annotate = method.annotate(ref1);
//                 annotate.param("value", StrUtil.toUnderlineCase(paramInfo.getPropCode()));
//                 method.body()._return(JExpr.refthis(paramInfo.getPropCode()));
//
//             }
//         }
//
//     }
//
//     private String setterName(StructNode node) {
//         return "set" + StrUtil.upperFirst(node.getMsgStructCode());
//     }
//
//     private String getterName(StructNode node) {
//         return "get" + StrUtil.upperFirst(node.getMsgStructCode());
//     }
//
//     @Override
//     public void fill(JCodeModel jCodeModel, JDefinedClass definedClass, StructNode node) {
//         if(!StrUtil.equals("3", node.getMsgStructType())){
//             return;
//         }
//         AbstractJClass ref = jCodeModel.ref("T");
//         JMethod setter = definedClass.method(JMod.PUBLIC, jCodeModel.VOID, setterName(node));
//         JVar param = setter.param(ref, node.getMsgStructCode());
//         setter.body().add(JExpr.refthis(node.getMsgStructCode()).assign(param));
//
//         JMethod method = definedClass.method(JMod.PUBLIC, ref, getterName(node));
//         AbstractJClass ref1 = jCodeModel.ref(ConstantsJcode.JSON_PROPERTY);
//         JAnnotationUse annotate = method.annotate(ref1);
//         annotate.param("value",  StrUtil.toUnderlineCase(node.getMsgStructCode()));
//         method.body()._return(JExpr.refthis(node.getMsgStructCode()));
//     }
// }
